複数アカウントのGuardDutyの通知を一つのアカウントにまとめる構成を実装してみた
こんにちは、臼田です。
前回GuardDutyを全リージョンに展開する方法を紹介しました。
今回はこれを応用してマルチアカウントに展開して、通知を一つのアカウントで受け取る構成を、同じくCloudFormationでやってみたいと思います。
GuardDutyのマルチアカウントをまとめる手法について
GuardDutyでは自身をマスターアカウントに設定し、他のAWSアカウントをメンバーアカウントとして招待することにより通知を1つのアカウントで受け取る機能があります。
詳細は下記をご確認ください。
これを利用するためには下記情報が必要になります。
- メンバーアカウントにするAWSアカウントのID
- 上記アカウントのrootユーザのメールアドレス
CloudFormation StackSetsの利用準備
前回と同様にCloudFormation StackSetsを利用します。
このStackSetsを利用するには事前に実行する側とされる側でそれぞれIAM Roleが必要になります。
前提条件: スタックセットオペレーションのアクセス権限の付与 - AWS CloudFormation
これを簡単に設定する方法は下記にまとめました。今回は管理側は実行する側とされる側両方になり、クライアント側アカウントは実行される側なので、それぞれのIAM Roleを作成してください。
管理側は「AWSCloudFormationStackSetAdministrationRole」と「AWSCloudFormationStackSetExecutionRole」の2つが、管理される側は後者が作成されれば準備完了です。
GuardDutyの展開
テンプレートの準備
マルチアカウント利用時のGuardDuty + SNS通知の有効化の管理側CloudFormationテンプレート案を下記に用意しました。
AWSTemplateFormatVersion: 2010-09-09 Description: 'enable guardduty, invite member and set alert' # add your member accounts Mappings: GuardDutyMembers: Member01: Email: mail@example.com AccountID: "000000000000" Member02: Email: mail@example.com AccountID: "111111111111" Member03: Email: mail@example.com AccountID: "222222222222" Member04: Email: mail@example.com AccountID: "333333333333" Parameters: MailAddress: Description: Enter email address to send notification. Type: String Resources: GDD: Type: 'AWS::GuardDuty::Detector' Properties: Enable: true SNST: Type: 'AWS::SNS::Topic' DependsOn: GDM01 Properties: TopicName: GuardDutyTopic SNSS: Type: "AWS::SNS::Subscription" Properties: Endpoint: !Ref MailAddress Protocol: email TopicArn: !Ref SNST ER: Type: 'AWS::Events::Rule' Properties: Name: AlertGuardDutyFindings Description: 'Alert to SNS topic when find threats by GuardDuty' EventPattern: { "source": [ "aws.guardduty" ], "detail-type": [ "GuardDuty Finding" ] } Targets: - Arn: !Ref SNST Id: Id123 # copy and incriment the following GDM01: Type: "AWS::GuardDuty::Member" Properties: Status: Invited MemberId: !FindInMap - GuardDutyMembers - Member01 - AccountID Email: !FindInMap - GuardDutyMembers - Member01 - Email Message: "invite this account to guardduty" DetectorId: !Ref GDD DisableEmailNotification: True GDM02: Type: "AWS::GuardDuty::Member" Properties: Status: Invited MemberId: !FindInMap - GuardDutyMembers - Member02 - AccountID Email: !FindInMap - GuardDutyMembers - Member02 - Email Message: "invite this account to guardduty" DetectorId: !Ref GDD DisableEmailNotification: True GDM03: Type: "AWS::GuardDuty::Member" Properties: Status: Invited MemberId: !FindInMap - GuardDutyMembers - Member03 - AccountID Email: !FindInMap - GuardDutyMembers - Member03 - Email Message: "invite this account to guardduty" DetectorId: !Ref GDD DisableEmailNotification: True GDM04: Type: "AWS::GuardDuty::Member" Properties: Status: Invited MemberId: !FindInMap - GuardDutyMembers - Member04 - AccountID Email: !FindInMap - GuardDutyMembers - Member04 - Email Message: "invite this account to guardduty" DetectorId: !Ref GDD DisableEmailNotification: True
実は、GuardDutyで複数アカウントをまとめる際にはAWS::GuardDuty::Member
というタイプで上記に上げたアカウントIDとrootのメールアドレスが必要になります。
そのため、それをテンプレートに記載しておく必要があります。テンプレート中のMappingとResourceのGDM01等を必要な数だけ増やして適切に設定してください。
作成したテンプレートを保存して、アップロードできる状態にしておきます。
管理側スタックセットの作成
まず作成したテンプレートを利用してGuardDutyの管理側をスタックセットで作成します。CloudFormationのページ左上からStackSetsを選択し、「スタックセットの作成」を押します。
適当なスタック名を入れ、パラメータのメールアドレスにSNSの通知先に設定するメールアドレスを入力して「次へ」を押します。
「スタックをアカウントにデプロイ」を選択して管理側のアカウントIDを入力します。 適用するリージョンを選択します。
権限はStackSets用のRoleが選択されていることを確認して「次へ」を押します。
確認画面で「作成」を押して完了です。
作成後は詳細画面が表示されます。少し時間はかかりますが、全てCURRENTとなりステータスが「SUCCEEDED」となればCloudFormationの適用が完了です。
これで管理側は完了です。SNSの登録メールが飛んでいるため、必要に応じて前回の下記記事の下部にあるunsubscribeを無効にする方法でconfirmしてください。
クライアント側作成
クライアント側はAWSでテンプレートが用意されてるのでそれを利用します。
「スタックセットの作成」から「以下のテンプレートからサンプルテンプレートを選択」を選び、「AWS GuardDutyの有効化」を選択して「次へ」を押します。
適当なスタックセット名を入力して、パラメータには管理側のAWSアカウントIDを入力します。
「スタックをアカウントにデプロイ」でクライアント側全てのアカウントIDを入力します。カンマ区切りで入力します。
必要なリージョンを指定します。
確認画面で「作成」を押して完了です。
作成後は詳細画面が表示されます。同じく少し時間はかかりますが、全てCURRENTとなりステータスが「SUCCEEDED」となればCloudFormationの適用が完了です。
以上で管理側とクライアント側双方のGuardDuty有効化と連携が完了になります。
まとめ
複数のアカウントにまたがってGuardDutyを連携する方法についてまとめました。
少しであれば手動で行ってもいいですが、全リージョン多数のアカウントに関して適用することを考えると、StackSetsを利用したほうが効率的です。
ぜひご利用ください!